From a610bb89a0fecf0b27001b4444b2e47e1c5e0af3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 28 Jul 2020 18:15:01 -0400 Subject: [PATCH] a11y: Set an accessible role for GtkSearchEntry Use the searchbox accessible role for GtkSearchEntry. And set properties as appropriate. Update the documentation and add a test. --- docs/reference/gtk/section-accessibility.md | 1 + gtk/gtkenums.h | 3 +- gtk/gtksearchentry.c | 24 ++++++++++-- testsuite/a11y/meson.build | 1 + testsuite/a11y/searchentry.c | 41 +++++++++++++++++++++ 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 testsuite/a11y/searchentry.c diff --git a/docs/reference/gtk/section-accessibility.md b/docs/reference/gtk/section-accessibility.md index 702e6b01d6..30c6f9e42b 100644 --- a/docs/reference/gtk/section-accessibility.md +++ b/docs/reference/gtk/section-accessibility.md @@ -56,6 +56,7 @@ Each role name is part of the #GtkAccessibleRole enumeration. | `PROGRESS_BAR` | An element that display progress | #GtkProgressBar | | `RADIO` | A checkable input in a group of radio roles | #GtkRadioButton | | `SCROLLBAR` | A graphical object controlling the scolling of content | #GtkScrollbar | +| `SEARCH_BOX` | A text box for entering search criteria | #GtkSearchEntry | | `SEPARATOR` | A divider that separates sections of content or groups of items | #GtkSeparator | | `SPIN_BUTTON` | A range control that allows seelcting among discrete choices | #GtkSpinButton | | `SWITCH` | A control that represents on/off values | #GtkSwitch | diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h index ca3a3f883d..c4d11cb95c 100644 --- a/gtk/gtkenums.h +++ b/gtk/gtkenums.h @@ -1217,7 +1217,8 @@ typedef enum { * of content within a viewing area, regardless of whether the content is fully * displayed within the viewing area. * @GTK_ACCESSIBLE_ROLE_SEARCH: Unused - * @GTK_ACCESSIBLE_ROLE_SEARCH_BOX: Unused + * @GTK_ACCESSIBLE_ROLE_SEARCH_BOX: A type of textbox intended for specifying + * search criteria. * @GTK_ACCESSIBLE_ROLE_SECTION: Unused * @GTK_ACCESSIBLE_ROLE_SECTION_HEAD: Unused * @GTK_ACCESSIBLE_ROLE_SELECT: Unused diff --git a/gtk/gtksearchentry.c b/gtk/gtksearchentry.c index ab94d0718c..ece8cc0c28 100644 --- a/gtk/gtksearchentry.c +++ b/gtk/gtksearchentry.c @@ -79,7 +79,10 @@ * * GtkSearchEntry has a single CSS node with name entry that carries * a .sarch style class, and the text node is a child of that. - + * + * # Accessibility + * + * GtkSearchEntry uses the #GTK_ACCESSIBLE_ROLE_SEARCH_BOX role. */ enum { @@ -177,14 +180,28 @@ gtk_search_entry_set_property (GObject *object, GParamSpec *pspec) { GtkSearchEntry *entry = GTK_SEARCH_ENTRY (object); + const char *text; if (gtk_editable_delegate_set_property (object, prop_id, value, pspec)) - return; + { + if (prop_id == NUM_PROPERTIES + GTK_EDITABLE_PROP_EDITABLE) + { + gtk_accessible_update_property (GTK_ACCESSIBLE (entry), + GTK_ACCESSIBLE_PROPERTY_READ_ONLY, !g_value_get_boolean (value), + -1); + } + + return; + } switch (prop_id) { case PROP_PLACEHOLDER_TEXT: - gtk_text_set_placeholder_text (GTK_TEXT (entry->entry), g_value_get_string (value)); + text = g_value_get_string (value); + gtk_text_set_placeholder_text (GTK_TEXT (entry->entry), text); + gtk_accessible_update_property (GTK_ACCESSIBLE (entry), + GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, text, + -1); break; case PROP_ACTIVATES_DEFAULT: @@ -398,6 +415,7 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass) gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); gtk_widget_class_set_css_name (widget_class, I_("entry")); + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_SEARCH_BOX); } static GtkEditable * diff --git a/testsuite/a11y/meson.build b/testsuite/a11y/meson.build index cd27dc80a2..8358d7b2c5 100644 --- a/testsuite/a11y/meson.build +++ b/testsuite/a11y/meson.build @@ -19,6 +19,7 @@ tests = [ { 'name': 'label' }, { 'name': 'progressbar' }, { 'name': 'scrollbar' }, + { 'name': 'searchentry' }, { 'name': 'separator' }, { 'name': 'spinbutton' }, { 'name': 'switch' }, diff --git a/testsuite/a11y/searchentry.c b/testsuite/a11y/searchentry.c new file mode 100644 index 0000000000..4c44940c64 --- /dev/null +++ b/testsuite/a11y/searchentry.c @@ -0,0 +1,41 @@ +#include + +static void +search_entry_role (void) +{ + GtkWidget *widget = gtk_search_entry_new (); + g_object_ref_sink (widget); + + gtk_test_accessible_assert_role (widget, GTK_ACCESSIBLE_ROLE_SEARCH_BOX); + + g_object_unref (widget); +} + +static void +search_entry_properties (void) +{ + GtkWidget *widget = gtk_search_entry_new (); + g_object_ref_sink (widget); + + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, NULL); + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, FALSE); + + g_object_set (widget, "placeholder-text", "Hello", NULL); + gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE); + + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, "Hello"); + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, TRUE); + + g_object_unref (widget); +} + +int +main (int argc, char *argv[]) +{ + gtk_test_init (&argc, &argv, NULL); + + g_test_add_func ("/a11y/searchentry/role", search_entry_role); + g_test_add_func ("/a11y/searchentry/properties", search_entry_properties); + + return g_test_run (); +} -- 2.30.2